﻿using System;
using System.Windows;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Prism.UnityExtensions;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.Logging;
using Modularity = Microsoft.Practices.Prism.Modularity;
using Ausy.Silverlight.Survey.Infrastructure.Context;
using Ausy.Silverlight.Survey.Common.Configuration;


namespace Ausy.Silverlight.Survey
{
    /// <summary>
    /// Cette classe représente un Bootstrapper pour instancier la page (shell) et charger le catalog de module issu du fichier ModulesCatalog.xaml
    /// </summary>
    public class Bootstrapper : UnityBootstrapper
    {
        #region Const

        /// <summary>
        /// Uri du Fichier contenant le catalog de module issu du fichier ModuleCatalog.xaml
        /// </summary>
        private const string MODULES_CATALOG_URI = "Ausy.Silverlight.Survey;component/Configuration/ModuleCatalog.xaml";

        #endregion

        #region Run Method

        /// <summary>
        /// Cette méthode permet d'éxécter le Bootstrapper
        /// </summary>
        /// <param name="runWithDefaultConfiguration">Utilisation de la configuration par défaut</param>
        public override void Run(bool runWithDefaultConfiguration)
        {
            // Chargement des éléments de configuration applicative
            if (Application.Current.InstallState != InstallState.Installed)
            {
                ConfigurationManager.Instance.ConfigurationDownloadCompleted += (config, configArgs) =>
                {
                    // lancement du BootStrapper
                    base.Run(runWithDefaultConfiguration);
                };

                ConfigurationManager.Instance.DownloadConfiguration();
            }
            else
            {
                // lancement du BootStrapper
                base.Run(runWithDefaultConfiguration);
            }
        }

        #endregion

        #region CreateLogger Method

        /// <summary>
        /// Cette méthode permet d'affecter le logger à utiliser par le Bootstrapper <see cref="ILoggerFacade"/>
        /// </summary>
        /// <returns>Logger</returns>
        protected override ILoggerFacade CreateLogger()
        {
            return base.CreateLogger();
        }

        #endregion

        #region CreateShell Method

        /// <summary>
        /// Cette méthode permet de créer le shell Fenetre principale de l'application
        /// </summary>
        /// <returns>Shell de l'application</returns>
        protected override DependencyObject CreateShell()
        {
            return null;
        }

        #endregion

        #region InitializeShell Method

        /// <summary>
        /// Cette méthode permet d'initialiser le Shell
        /// </summary>
        protected override void InitializeShell()
        {
            base.InitializeShell();
        }

        #endregion

        #region CreateModuleCatalog Method

        /// <summary>
        /// Création du Catalog de Modules
        /// </summary>
        /// <returns>Catalog de Modules</returns>
        protected override IModuleCatalog CreateModuleCatalog()
        {
            return Modularity.ModuleCatalog.CreateFromXaml(new Uri(MODULES_CATALOG_URI, UriKind.Relative));
        }

        #endregion

        #region ConfigureContainer Method

        /// <summary>
        /// Cette méthode permet de configurer Le container IoC <see cref="IUnityContainer"/>. 
        /// </summary>
        protected override void ConfigureContainer()
        {
            base.ConfigureContainer();
            this.Container.RegisterType<IApplicationContext, ApplicationContext>(new ContainerControlledLifetimeManager());
        }

        #endregion
    }
}
